package com.htgd.gardenexpo.utils;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author ：hejing
 * @date ：Created in 2021/6/22 15:02
 * @description：配置拦截器
 * @modified By：`
 * @version: 1.0
 */

@Configuration
@EnableKnife4j
@Component
public class WebConfiguration implements WebMvcConfigurer {

    @Autowired
    private TokenInterceptor tokenInterceptor;

    @Value("${static.path}")
    private String path;



    //构造方法
    public WebConfiguration(TokenInterceptor tokenInterceptor){
        this.tokenInterceptor = tokenInterceptor;
    }

//    @Override
//    public void addCorsMappings(CorsRegistry registry) {
//        registry.addMapping("/**")
//                .allowCredentials(true)
//                .allowedHeaders("*")
//                .allowedMethods("*")
//                .allowedOrigins("*");
//    }

//    @Override
//    public void addCorsMappings(CorsRegistry registry) {
//        registry.addMapping("/**") // 匹配所有路径
//                .allowedOrigins("*") // 允许所有来源
//                .allowedMethods("*") // 允许所有HTTP方法
//                .allowedHeaders("*") // 允许所有请求头
//                .allowCredentials(true) // 允许发送认证信息（如Cookie）
//                .maxAge(3600); // 预检请求的有效期，单位秒
//    }
    /*@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://192.168.4.33")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }*/

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }


    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer){
        configurer.setTaskExecutor(new ConcurrentTaskExecutor(Executors.newFixedThreadPool(3)));
        configurer.setDefaultTimeout(30000);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("file:"+path);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        List<String> excludePath = new ArrayList<>();
        //排除拦截，除了注册登录(此时还没token)，其他都拦截
        excludePath.add("/api/user/register");
        excludePath.add("/api/user/loginByCode");
        excludePath.add("/api/user/userlogin");
        excludePath.add("/api/user/registeredByApplets");
        excludePath.add("/api/user/registeredByphone");
        excludePath.add("/api/user/verificationByPhone");
        excludePath.add("/api/user/getUserRoleMenu");
        excludePath.add("/api/user/resetByPhone");
        excludePath.add("/api/user/resetByPwd");
        excludePath.add("/api/user/registeredByWX");
        excludePath.add("/api/user/registeredByWxOpenId");
        excludePath.add("/api/user/verifyByWxPublicCode");
        excludePath.add("/api/user/registeredByPublicOpenId");
        excludePath.add("/api/user/getOrderInfoByOrderNo");
        excludePath.add("/api/user/invoice");
        excludePath.add("/api/user/checkInvoice");
        excludePath.add("/api/user/getUserInfoByAccessToken");
        excludePath.add("/api/**/addAccess");
//        excludePath.add("/api/user/getQrCode");
        excludePath.add("/api/v1/**");
        excludePath.add("/api/version/getAllByType");
        excludePath.add("/api/power/searchRaidersMenuTree");
        excludePath.add("/api/basis/searchQuickEntry");
        excludePath.add("/api/basis/exportUserInfo");
        excludePath.add("/api/basis/exportRole");
//        excludePath.add("/api/reservation/getrules");
        excludePath.add("/api/basis/searchOrganization");
//        excludePath.add("/api/basis/getWeatherNew");
//        excludePath.add("/api/**/list");
        excludePath.add("/api/device/token");
        excludePath.add("/api/socialContent/getPageCritiqueList");
        excludePath.add("/api/socialContent/kk");
//        excludePath.add("/api/**/detail");
//        excludePath.add("/api/**/details");

        excludePath.add("/api/basis/getWeatherInfo");
        excludePath.add("/api/basis/getPhoneNumber");
        excludePath.add("/api/basis/addUserInfo");
        excludePath.add("/api/basis/getAllUser");

//        excludePath.add("/api/v1/**");
        excludePath.add("/api/expoinformat/searchIntroduction");
        excludePath.add("/api/expoinformat/searchOpeningTime");

        excludePath.add("/api/gis/sourcelist");
        excludePath.add("/api/gis/sourcedetails");
        excludePath.add("/api/gis/arealist");

        excludePath.add("/api/news/addHit");

        excludePath.add("/api/line/getLineList");

        excludePath.add("/api/theaterPlan/changeSeat");

        excludePath.add("/static/**");
        excludePath.add("/upload/**");
        excludePath.add("/weather/**");
        excludePath.add("/head/**");
        excludePath.add("/my/**");
        excludePath.add("/icon/**");
        excludePath.add("/images/**");
        excludePath.add("/assets/**");
        excludePath.add("/plant/**");

//        excludePath.add("/api/wxUser/**");
        excludePath.add("/api/wxUser/login");
//        excludePath.add("/api/depart/**");

//        excludePath.add("/task/**");
        excludePath.add("/api/singlePoint/login");

//        excludePath.add("/api/dictItem/**");
//        excludePath.add("/api/dict/**");

        excludePath.add("/api/feedback/addMini");

//        excludePath.add("/api/information/**");

//        excludePath.add("/util/rsa/**");
        excludePath.add("/utils/token/**");

        excludePath.add("/api/giantscreen/homeList");

//        excludePath.add("/api/wxJs/**");
        excludePath.add("/api/wxUtil/receive");

        excludePath.add("/api/food/getRanking");





        excludePath.add("/doc.html");
        excludePath.add("/webjars/**");
        excludePath.add("/swagger-resources");
        excludePath.add("/v2/api-docs");

        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(excludePath);
//        super.addInterceptors(registry);
    }


    @Bean
    public Docket docket() {
        System.out.println("bean注入");
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("温榆河文档")
                .version("2.0")
                .description("温榆河文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.htgd.gardenexpo.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

}
